package cn.xzqwjw.taskmanager.controller.api;

import cn.xzqwjw.taskmanager.domain.pojo.SysAdmin;
import cn.xzqwjw.taskmanager.service.SysAdminService;
import org.hibernate.validator.constraints.Length;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * 管理员管理
 *
 * @author rush
 */
@RestController
@RequestMapping("/api/admin")
@Validated
public class SysAdminController {

  private final SysAdminService adminService;

  @Autowired
  public SysAdminController(SysAdminService adminService) {
    this.adminService = adminService;
  }

  // @PreAuthorize("hasAuthority('admin_add')")
  // 上面这个是方法级别的分配权限，但是我们用了数据库表去存每个路径相对应的权限
  // 所以这里就没有必要再用这种办法了，而且这种办法不能用我们的"ROLE_SUPERADMIN"

  /**
   * 处理 "/api/admin" 的 POST 请求，添加管理员
   */
  @PostMapping("")
  public String add(
      @NotNull(message = "不能提交空资料")
      @Valid @RequestBody SysAdmin admin) {
    return adminService.add(admin);
  }

  /**
   * 处理 "/api/admin/{id}" 的 DELETE 请求，删除管理员
   */
  @DeleteMapping("/{id:[0-9]+}")
  public String delById(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id) {
    return adminService.delById(id);
  }

  /**
   * 处理 "/api/admin" 的 PUT 请求，修改管理员信息
   */
  @PutMapping("")
  public String modifyAll(
      @NotNull(message = "不能提交空资料")
      @Valid @RequestBody SysAdmin admin) {
    return adminService.modifyAll(admin);
  }

  /**
   * 处理 "/api/admin/10" 的 PATCH 请求，修改状态
   */
  @PatchMapping("/{id:[0-9]+}/status")
  public String patchStatus(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id,
      @NotBlank(message = "参数不能为空")
      @Length(min = 7, max = 18, message = "长度应为{min}到{max}个字符")
      @RequestParam(value = "Action") String action) {
    return adminService.patchStatus(id, action);
  }

  /**
   * 处理 "/api/admin/10/password" 的 PATCH 请求，修改密码
   */
  @PatchMapping("/{id:[0-9]+}/password")
  public String patchPassword(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id,
      @NotBlank(message = "参数不能为空")
      @RequestBody String paramsJson) {
    return adminService.patchPassword(id, paramsJson);
  }

  // ==================== 查询 ====================

  /**
   * 处理 "/api/admin/10" 的 GET 请求
   * 根据管理员id查询得到某个管理员的详情
   */
  @GetMapping("/{id:[0-9]+}")
  public String queryById(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id) {
    return adminService.queryById(id);
  }

  /**
   * 处理 "/api/admin/username=..." 的 GET 请求
   * 根据参数查询得到管理员
   */
  @GetMapping("/")
  public String queryByUsername(
      @NotBlank(message = "参数不能为空")
      @Length(min = 4, max = 20, message = "用户名长度应为{min}到{max}个字符")
      @RequestParam(value = "Username") String username) {
    return adminService.queryByUsername(username);
  }

  @GetMapping("/list-all")
  public String listAll(
      @RequestParam(value = "Type", defaultValue = "admin") String type) {
    return adminService.listAll(type);
  }

}
